package cn.izeno.wx.service

import cn.izeno.wx.models.mp.*
import io.reactivex.rxjava3.core.Observable
import okhttp3.RequestBody
import retrofit2.http.*

/**
 * [客服消息接口](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547)
 * [模版消息](https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=528066317&lang=zh_CN)
 *
 * 当用户和公众号产生特定动作的交互时（具体动作列表请见下方说明），
 * 微信将会把消息数据推送给开发者，开发者可以在一段时间内（目前修改为48小时）
 * 调用客服接口，通过POST一个JSON数据包来发送消息给普通用户。
 * 此接口主要用于客服等有人工消息处理环节的功能，方便开发者为用户提供更加优质的服务。
 *
 * 目前允许的动作列表如下（公众平台会根据运营情况更新该列表，
 * 不同动作触发后，允许的客服接口下发消息条数不同，下发条数达到上限后，
 * 会遇到错误返回码）
 *
 * - 1、用户发送信息
 * - 2、点击自定义菜单（仅有点击推事件、扫码推事件、扫码推事件且弹出“消息接收中”提示框这3种菜单类型是会触发客服接口的）
 * - 3、关注公众号
 * - 4、扫描二维码
 * - 5、支付成功
 * - 6、用户维权
 *
 * __所有使用到media_id的地方，现在都可以使用素材管理中的永久素材media_id了。__
 */
interface CustomerService {

  /**
   * ### **添加客服帐号**
   * 开发者可以通过本接口为公众号添加客服账号，
   * 每个公众号最多添加10个客服账号。
   */
  @POST("https://api.weixin.qq.com/customservice/kfaccount/add")
  fun addAccount(
      @Body body: KfAccountParam,
      @Query("access_token") accessToken: String = body.accessToken
  ): Observable<String>


  @POST("https://api.weixin.qq.com/customservice/kfaccount/update")
  fun updateAccount(
      @Body body: KfAccountParam,
      @Query("access_token") accessToken: String = body.accessToken
  ): Observable<String>


  @POST("https://api.weixin.qq.com/customservice/kfaccount/del")
  fun deleteAccount(
      @Body body: KfAccountParam,
      @Query("access_token") accessToken: String = body.accessToken
  ): Observable<String>

  @GET("https://api.weixin.qq.com/cgi-bin/customservice/getkflist")
  fun accounts(@Query("access_token") accessToken: String): Observable<KfList>


  /**
   * 设置客服帐号的头像
   * 必须是 jpg 格式, 推荐 640 x 640 以上
   *
   * @param headImgFile
   *
   *  File        photoFile = new File(photoPath);
   *  RequestBody fileBody  = RequestBody.create(MediaType.parse("image/\*"), photoFile);
   */
  @POST("https://api.weixin.qq.com/customservice/kfaccount/uploadheadimg")
  @Multipart
  fun uploadAccountHeadImg(
      @Query("access_token") accessToken: String,
      @Part("media\";filename=headimg.jpg") headImgFile: RequestBody
  ): Observable<String>

  @POST("https://api.weixin.qq.com/cgi-bin/message/custom/send")
  fun sendMessage(
      @Body body: KfMessage,
      @Query("access_token") accessToken: String = body.accessToken
  ): Observable<String>

  @POST("https://api.weixin.qq.com/cgi-bin/message/template/send")
  fun sendTempMessage(@Body body: TempMessageParam, @Query("access_token") accessToken: String = body.accessToken): Observable<TempMessage>
}